const fruits = ["Banana", "Orange", "Apple", "Mango"];

// 长度
console.log(fruits.length);

// 字符串
console.log(fruits.toString());
console.log(fruits.join("..")); // 指定分隔符

// 访问元素
console.log(fruits[1]);
console.log(fruits[-1]); // undefined;
console.log(fruits.at(-1)); // js 默认不支持负值索引，ES2022 引入了 at 实现负值效果

// 数组更新
console.log(fruits.push("Lemon")); // 添加元素
console.log(fruits.pop()); // 移除最后一个元素
console.log(fruits.shift()); // 移除第一个元素
console.log(fruits.unshift("Lemon")); // 添加第一个元素

// 修改值
fruits[0] = "Kiwi";

// 删除，使用 delete, 元素会被删除，但数组长度不变，数组元素会被 undefined 填充，请使用 pop | shift
delete fruits[1];
console.log(fruits);

// 合并
console.log(fruits.concat("Cecilie", "Lone", ["Robin", "Morgan"]));

// 复制
console.log(fruits.copyWithin(2, 0)); // 复制到索引2，从索引0开始，复制到最后

// 数组扁平化
const myArr = [
  [1, 2],
  [3, 4],
  [5, 6],
];
console.log(myArr.flat());
const myArr1 = [1, 2, 3, 4, 5, 6];
console.log(myArr1.flatMap((x) => [x, x * 10]));

// 切片、拼接
console.log(["Jan", "Feb", "Mar", "Apr"].splice(2, 0, "Lemon", "Kiwi")); // 从索引2开始，删除0个元素，添加Lemon和Kiwi
const months = ["Jan", "Feb", "Mar", "Apr"];
months.splice(0, 1);
console.log(months); // 改变原数组
const month = months.toSpliced(0, 1); //ES2023 不改变原数组，返回除删除元素以外元素的一个新数组
console.log(month, months);
console.log(months.slice(1)); //从元素1开始切片，返回一个新数组

// 查找
{
  const fruits = ["Apple", "Orange", "Apple", "Mango"];
  console.log(fruits.indexOf("Apple")); // 返回第一个匹配元素的索引
  console.log(fruits.lastIndexOf("Apple")); // 返回最后一个匹配元素的索引
  console.log(fruits.includes("Apple")); // 返回布尔值，是否包含指定元素
  console.log(fruits.find((x) => x === "Apple")); // 返回第一个匹配元素
  console.log(fruits.findIndex((x) => x === "Apple")); // 返回第一个匹配元素的索引
  console.log(fruits.findLast((x) => x === "Apple")); // 从尾部开始，返回第一个匹配元素
  console.log(fruits.findLastIndex((x) => x === "Apple")); // 从尾部开始,返回第一个匹配元素的索引
}

// 排序
{
  const fruits = ["Banana", "Orange", "Apple", "Mango"];
  fruits.sort();
  console.log(fruits);
  // 反转
  fruits.reverse();
  console.log(fruits);

  console.log(fruits.toSorted()); // 返回新数组，不影响原数组
  console.log(fruits.toReversed()); // 返回新数组，不影响原数组

  const points = [40, 100, 1, 5, 25, 10];
  points.sort(function (a, b) {
    return a - b;
  });
  console.log(points); // 升序

  points.sort(function (a, b) {
    return b - a;
  });
  console.log(points); // 降序
}
